/**
 * [8] 字符串转换整数 (atoi)
 * 请你来实现一个 myAtoi(string s) 函数，使其能将字符串转换成一个 32 位有符号整数。
 * 函数 myAtoi(string s) 的算法如下：
 * 空格：读入字符串并丢弃无用的前导空格（" "）
 * 符号：检查下一个字符（假设还未到字符末尾）为 '-' 还是 '+'。如果两者都不存在，则假定结果为正。
 * 转换：通过跳过前置零来读取该整数，直到遇到非数字字符或到达字符串的结尾。如果没有读取数字，则结果为0。
 * 舍入：如果整数数超过 32 位有符号整数范围 [−231,  231 − 1] ，需要截断这个整数，使其保持在这个范围内。具体来说，小于 −231 的整数应该被舍入为 −231 ，大于 231 − 1 的整数应该被舍入为 231 − 1 。
 * 返回整数作为最终结果。
 *
 * @format
 * @lc app=leetcode.cn id=8 lang=typescript
 */

// @lc code=start
const boundary = [2 ** 31 - 1, -(2 ** 31)]
function myAtoi(s: string): number {
    // const rule = /^[+-][0-9]+$/
  //   const targets = s.match(rule)
  //   if (targets === null) return 0
  //   else {
  //     const target = targets[0]
  //     let [res, sign, i, j] = [0, 0, 0, target.length]
  //     if (target[0] === "+") i = 1
  //     if (target[0] === "-") (sign = 1), (i = 1)
  //     while (i < target.length && target[i] === "0") i++
  //     while (j >= i) {
  //         res += target[j--]
  //     }
  //   }
//   const rule = /[+-]?[0-9]+/
//   const targets = s.match() ?? ["0"]
  const res = parseInt(s)
  if (isNaN(res)) return 0
  return res >= boundary[0]
    ? boundary[0]
    : res <= boundary[1]
    ? boundary[1]
    : res
}
// @lc code=end
